/**
 * @file invoker.h
 * @brief Definizione dell'interfaccia dell'entità Invoker.
 *
 * L'interfaccia specifica le possibili configurazioni per la gestione delle thread, ovvero dei comandi,
 * richiamati dall'utente.
 *
 * @date Feb 26, 2012
 * @author Francesco Corvino
 */

#ifndef INVOKER_H_
#define INVOKER_H_

#include "../MemObj/executionObj.h"

/**
 * @brief Nome utilizzato per il logging
 */
#define LOG_NAMEINVOKER "invoker"

/**
 * @brief descrive le funzionalità esterne di cui necessità la "classe" Invoker.
 *
 * Nella sua operazione principale di invocare i comandi la classe ha bisogno di:
 *  - una funzione per aggiungere le richieste riscontrate dai vari client.
 *  - una funzione per recuperare dal registro i comandi disponibili.
 *  - una funzione per registrare l'history dei comandi effettuati.
 *
 */
typedef struct invoker {
	/**
	 * @brief Dichiarazione della funzione che dovrà recuperare i comandi registrati in memoria.
	 *
	 * Se settato a NULL l'invoker non trova i comandi da eseguire. Si può settare sia con una funzione
	 * che restituisce direttamente il puntatore al comando da eseguire, oppure una funzione con operazioni
	 * più complesse.
	 */
	DynArray * (*getCommands)();

	/**
	 * @brief Dichiarazione della funzione che registrerà le richieste pervenute.
	 *
	 * Assegnare questa funzione se si vuole controllare le richieste effettuate o eseguire
	 * altre operazioni prima di invocare un comando.
	 */
	int (*addReq)(UserRequest *req);

	/**
	 * @brief Permette di registrare l'intera richiesta arrivata all'invoker.
	 *
	 * Se settata a NULL, l'invoker non effettua nessuna operazione altrimenti richiama la funzione
	 * passandogli l'intera stringa della richiesta effettuata.
	 */
	int (*addHistory)(char*);
} Invoker;

void Invoke_setInvoker(Invoker *value);

void Invoke_invokeCMD(UserRequest * req);

#endif /* INVOKER_H_ */
